package com.ch.personmis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                // 1. 配置请求权限
                .authorizeHttpRequests(authorize -> authorize
                        // 允许匿名访问的路径（精确匹配HTTP方法）
//                        .requestMatchers(HttpMethod.GET, "/login").permitAll()   // 登录页面（GET）
//                        .requestMatchers(HttpMethod.POST, "/login").permitAll()  // 登录提交（POST）
                        .requestMatchers(HttpMethod.POST, "/register").permitAll() // 注册接口（POST）
//                        .requestMatchers("/regix", "/").permitAll()                          // 其他公开路径
                        // 角色权限（注意：Spring Security 自动添加 "ROLE_" 前缀，例如 "ADMIN" 对应 "ROLE_ADMIN"）
//                        .requestMatchers("/admin/**").hasRole("ADMIN")                       // 修正角色名（全大写）
//                        .requestMatchers("/getDepartment/**").hasRole("USER")                 // 修正角色名（全大写）
                        // 其他所有请求需要认证
                        .anyRequest().authenticated()
                )
                // 2. 配置表单登录（指定登录页面路径）
//                .formLogin(formLogin -> formLogin
//                        .loginPage("/login")         // 指定自定义登录页面路径
//                        .loginProcessingUrl("/login") // 登录处理接口（与表单action一致）
//                        .defaultSuccessUrl("/home", true)       // 登录成功后跳转（避免重定向循环）
//                        .failureUrl("/login?error")   // 登录失败后跳转
//                )
                .formLogin(Customizer.withDefaults())
                // 3. 关闭CSRF（仅开发环境，生产环境需启用并添加CSRF令牌到表单）
                .csrf(csrf -> csrf.disable());

        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}